package com.qwer.util;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;

public class DateUtils extends org.apache.commons.lang3.time.DateUtils {

	/**
	 * 月份格式
	 */
	public static final String DATE_STYLE_MONTH = "yyyy-MM";

	/**
	 * 日期格式
	 */
	public static final String DATE_STYLE_BASIC = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 日期格式
	 */
	public static final String DATE_STYLE_NOPOINT = "yyyyMMdd";
	/**
	 * 日期格式
	 */
	public static final String DATE_STYLE_MILLISECOND = "yyyyMMddHHmmssSSS";

	/**
	 * 日期格式
	 */
	public static final String DATE_STYLE_SIMPLE = "yyyy-MM-dd";

	/**
	 * 日期格式
	 */
	public static final String DATE_STYLE_SIMPLE_CN = "yyyy年MM月dd日";

	private static String[] parsePatterns = { "yyyy-MM-dd",
			"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy/MM/dd",
			"yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm" };

	public static Date parseDateTime(String datetime) {
		if (datetime == null || datetime.trim().length() == 0) {
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_STYLE_BASIC);
		try {
			return sdf.parse(datetime);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 得到当前日期字符串 格式（yyyy-MM-dd）
	 */
	public static String getDate() {
		return getDate("yyyy-MM-dd");
	}

	/**
	 * 得到当前日期字符串 格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
	 */
	public static String getDate(String pattern) {
		return DateFormatUtils.format(new Date(), pattern);
	}

	/**
	 * 得到日期字符串 默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
	 */
	public static String formatDate(Date date, Object... pattern) {
		if (date == null)
			return "";
		String formatDate = "";
		if (pattern != null && pattern.length > 0) {
			formatDate = DateFormatUtils.format(date, pattern[0].toString());
		} else {
			formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
		}
		return formatDate;
	}

	public static String format(Date date, String pattern) {
		if (null == date) {
			return "";
		}
		if (StringUtils.isEmpty(pattern)) {
			pattern = "yyyy-MM-dd";
		}
		return DateFormatUtils.format(date, pattern);
	}

	/**
	 * 得到日期时间字符串，转换格式（yyyy-MM-dd）
	 */
	public static String formatDate(Date date) {
		return formatDate(date, "yyyy-MM-dd");
	}

	/**
	 * 得到日期时间字符串，转换格式（yyyy-MM-dd HH:mm:ss）
	 */
	public static String formatDateTime(Date date) {
		return formatDate(date, "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 得到当前时间字符串 格式（HH:mm:ss）
	 */
	public static String getTime() {
		return formatDate(new Date(), "HH:mm:ss");
	}

	/**
	 * 得到当前日期和时间字符串 格式（yyyy-MM-dd HH:mm:ss）
	 */
	public static String getDateTime() {
		return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 得到当前年份字符串 格式（yyyy）
	 */
	public static String getYear() {
		return formatDate(new Date(), "yyyy");
	}

	/**
	 * 得到当前月份字符串 格式（MM）
	 */
	public static String getMonth() {
		return formatDate(new Date(), "MM");
	}

	/**
	 * 得到当天字符串 格式（dd）
	 */
	public static String getDay() {
		return formatDate(new Date(), "dd");
	}

	/**
	 * 得到当前星期字符串 格式（E）星期几
	 */
	public static String getWeek() {
		return formatDate(new Date(), "E");
	}

	/**
	 * 日期型字符串转化为日期 格式 { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
	 * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm" }
	 */
	public static Date parseDate(Object str) {
		if (str == null) {
			return null;
		}
		try {
			return parseDate(str.toString(), parsePatterns);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 获取过去的天数
	 * 
	 * @param date
	 * @return
	 */
	public static long pastDays(Date date) {
		long t = new Date().getTime() - date.getTime();
		return t / (24 * 60 * 60 * 1000);
	}

	public static Date getDateStart(Date date) {
		if (date == null) {
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			date = sdf.parse(formatDate(date, "yyyy-MM-dd") + " 00:00:00");
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}

	public static Date getDateEnd(Date date) {
		if (date == null) {
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			date = sdf.parse(formatDate(date, "yyyy-MM-dd") + " 23:59:59");
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}

	/**
	 * 获取几天后的日期
	 * 
	 * @param date
	 *            日期
	 * @param days
	 *            天数
	 * @return 几天后的日期
	 * @throws ParseException
	 * @author WangHanfu
	 */
	public static Date getDateAfterDays(Date date, int days)
			throws ParseException {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DATE, days);
		return cal.getTime();
	}

	/**
	 * 获取日期相差天数
	 * 
	 * @param
	 * @return 日期类型时间
	 * @throws ParseException
	 */
	public static Long getDiffDay(String beginDate, String endDate)
			throws ParseException {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		Long checkday = 0l;
		// 开始结束相差天数
		checkday = (formatter.parse(endDate).getTime() - formatter.parse(
				beginDate).getTime())
				/ (1000 * 24 * 60 * 60);

		return checkday;
	}

	/**
	 * Description: 检查是否date2在date1日期以前
	 * 
	 * @param date1
	 * @param date2
	 * @return true date2在date1前
	 * @see
	 */
	public static boolean isBefore(Date date1, Date date2) {
		boolean ret = false;

		Calendar c1 = Calendar.getInstance();
		Calendar c2 = Calendar.getInstance();

		c1.setTime(date1);
		c2.setTime(date2);

		if (c2.before(c1)) {
			ret = true;
		}
		return ret;
	}

	public static Date parseDate(String date, String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		try {
			return sdf.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static String formatDate(String date) {
		if (date == null || date.trim().length() == 0) {
			return "";
		}
		String str = "";
		try {
			str = DateUtils.format(
					DateUtils.parseDate(date, DateUtils.DATE_STYLE_SIMPLE),
					DateUtils.DATE_STYLE_SIMPLE_CN);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return str;
	}

	/**
	 * 第N期还款预定还款日
	 * 
	 * @param inDate
	 *            借入日期
	 * @param repayNum
	 *            指定的还款期数
	 * @return 第N期还款预定还款日
	 * @author WangHanfu
	 */
	public static Date getRepaymentDate(Date inDate, int repayNum) {

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(inDate);
        calendar.add(Calendar.MONTH, repayNum);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        return calendar.getTime();
    }
    
    /**
     * 将秒数转化为时分秒形式 
     * @param sec
     * @return
     */
    public static String secToTime(BigDecimal sec)
    {
        if (null==sec)
        {
            return "0秒";
        }
        try
        {
            long secL = (long)sec.doubleValue();
            long hl = secL / (60 * 60);
            long ml = (secL - (60 * 60 * hl)) / 60;
            long sl = secL - (ml * 60) - (60 * 60 * hl);
            StringBuilder builder = new StringBuilder();
            if (hl > 0)
            {
                builder.append(hl + "小时");
            }
            if (ml > 0)
            {
                builder.append(ml + "分");
            }

            builder.append(sl + "秒");
            return builder.toString();
        } catch (Exception e)
        {
            return "0秒";
        }
    }
    
	/**
	 * 将秒数转化为时分秒形式
	 * 
	 * @param sec
	 * @return
	 */
	public static String secToTime(String sec) {
		if (StringUtils.isEmpty(sec)) {
			return "0秒";
		}
		try {
			long secL = (long)(new BigDecimal(sec).doubleValue());
			long hl = secL / (60 * 60);
			long ml = (secL - (60 * 60 * hl)) / 60;
			long sl = secL - (ml * 60) - (60 * 60 * hl);
			StringBuilder builder = new StringBuilder();
			if (hl > 0) {
				builder.append(hl + "小时");
			}
			if (ml > 0) {
				builder.append(ml + "分");
			}

			builder.append(sl + "秒");
			return builder.toString();
		} catch (Exception e) {
			return "0秒";
		}
	}

	/*
	 * 查询条件是否包含当月
	 */
	public static boolean isCoverThismonth(String beginMonth, String endMonth) {
		Date now = new Date();
		Date beginTime = DateUtils.parseDate(beginMonth + "-01 00:00:00",
				DateUtils.DATE_STYLE_BASIC);
		Date endTime = DateUtils.parseDate(endMonth + "-01 23:59:59",
				DateUtils.DATE_STYLE_BASIC);
		Calendar c = Calendar.getInstance();
		c.setTime(endTime);
		int MaxDay = c.getActualMaximum(Calendar.DAY_OF_MONTH);
		c.set(Calendar.DATE, MaxDay);
		endTime = c.getTime();
		return DateUtils.isBefore(now, beginTime)
				&& DateUtils.isBefore(endTime, now);
	}

	/**
	 * 获得指定的月份
	 * 
	 * @param month
	 *            格式：yyyy-MM
	 * @param add
	 *            上月为-1 ，下月为1，当前月为0
	 * @return
	 */
	public static String getMonth(String month, int add) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(DateUtils.parseDate(month, DateUtils.DATE_STYLE_MONTH));
		calendar.add(Calendar.MONTH, add);
		return DateUtils.format(calendar.getTime(), DateUtils.DATE_STYLE_MONTH);
	}

	/**
	 * 获得指定的月份(基准当前时间)
	 * 
	 * @param month
	 *            格式：yyyy-MM
	 * @param add
	 *            上月为-1 ，下月为1，当前月为0
	 * @return
	 */
	public static String getMonth(int add) {
		return getMonth(
				DateUtils.format(new Date(), DateUtils.DATE_STYLE_MONTH), add);
	}

	/**
	 * @param month
	 * @return
	 */
	public static String getLastTimeMonth(String month) {
		Date endTime = null;
		endTime = DateUtils.parseDate(month, DateUtils.DATE_STYLE_MONTH);
		Calendar c = Calendar.getInstance();
		c.setTime(endTime);
		int MaxDay = c.getActualMaximum(Calendar.DAY_OF_MONTH);
		c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), MaxDay, 23, 59, 59);
		endTime = c.getTime();
		return DateUtils.format(endTime, DateUtils.DATE_STYLE_BASIC);
	}
}